package main

import (
    "fmt"
    "path/filepath" // 用于文件路径处理（跨平台）
    "strings"       // 用于字符串处理
)

func main() {

    // 使用 filepath.Join 将多个路径元素拼接为一个路径（自动处理斜杠）
    p := filepath.Join("dir1", "dir2", "filename")
    fmt.Println("p:", p) // 输出：dir1/dir2/filename（Windows 下是 \）

    // Join 自动清理重复的斜杠
    fmt.Println(filepath.Join("dir1//", "filename")) // 输出：dir1/filename

    // Join 中 ".." 表示上一级目录，会被规范化
    fmt.Println(filepath.Join("dir1/../dir1", "filename")) // 输出：dir1/filename

    // 获取路径的目录部分（不包括文件名）
    fmt.Println("Dir(p):", filepath.Dir(p)) // 输出：dir1/dir2

    // 获取路径的基本名（即文件名）
    fmt.Println("Base(p):", filepath.Base(p)) // 输出：filename

    // 判断路径是否为绝对路径（是否以 / 或盘符开头）
    fmt.Println(filepath.IsAbs("dir/file"))   // 输出：false
    fmt.Println(filepath.IsAbs("/dir/file"))  // 输出：true（Windows 下可能是 false，除非 "C:\..."）

    filename := "config.json"

    // 提取文件扩展名（包括 .）
    ext := filepath.Ext(filename) // 输出：.json
    fmt.Println(ext)

    // 去掉扩展名（使用 strings 包）
    fmt.Println(strings.TrimSuffix(filename, ext)) // 输出：config

    // 获取从 base 到 target 的相对路径（a/b -> a/b/t/file）
    rel, err := filepath.Rel("a/b", "a/b/t/file")
    if err != nil {
        panic(err)
    }
    fmt.Println(rel) // 输出：t/file

    // 获取 a/b 到 a/c/t/file 的相对路径（需要跳出当前路径）
    rel, err = filepath.Rel("a/b", "a/c/t/file")
    if err != nil {
        panic(err)
    }
    fmt.Println(rel) // 输出：../c/t/file
}
